﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Data.OleDb;
using System.IO;

namespace DiaryPlanner
{
    public partial class Album : UserControl
    {
        public ArrayList FolderList = new ArrayList();//폴더들을 관리하는 리스트
        public AlbumFolder nowFolder;//현재 지정된 폴더
        public AlbumPhoto nowPhoto;//현재 지정된 사진

        public Boolean photoDeleteChecker = false;
       
        public Album()
        {
            InitializeComponent();
       
            
            try//Album 폴더 생성
            {
                // If the directory doesn't exist, create it.
                if (!Directory.Exists("UserImage/" + UserProfile.Instance().userId + "/Album"))
                {
                    
                    Directory.CreateDirectory("UserImage/"+UserProfile.Instance().userId+"/Album");
                }
            }
            catch (Exception)
            {
                // Fail silently
            }

            initAlbum_db();
            if (FolderList.Count != 0) {
                nowFolder = FolderList[0] as AlbumFolder;
                openFolderImage(nowFolder);
            }
            viewAllFolder();
            viewAllPhoto();

        }

        public void skinSet() {
            string skin = UserProfile.Instance().setting;
            if (skin=="b")
            {
                this.BackColor = System.Drawing.Color.PaleTurquoise;

            }
            else if (skin=="c")
            {
                this.BackColor = System.Drawing.Color.LawnGreen;
            }
            else if (skin=="d")
            {
                this.BackColor = System.Drawing.Color.MistyRose;

            }
            else
            { //skin=="a"
                this.BackColor = System.Drawing.SystemColors.ControlLight;

            }
        }

        private void btnFolderAdd_Click(object sender, EventArgs e)
        {
            AlbumAddFolder aaf = new AlbumAddFolder(this);//새 폴더를 추가하는 다이얼로그
            aaf.ShowDialog();
            aaf = null;
        }


        public void viewAllPhoto() {

            photoPanel.Controls.Clear();

            if (nowFolder == null) {
                return;
            }

            int i = 0;
            foreach (AlbumPhoto af in nowFolder.PhotoList)
            {
                //Label lb = new Label();//폴더 이름
                //lb.Text = af.folderName;
                //lb.Size = new Size(70, 12);
                //folderPanel.Controls.Add(lb);
                //lb.Location = new Point(5, 60 + 70 * i);

                photoPanel.Controls.Add(af);//사진
                
                af.Location = new Point(5 + 105 * (i % 6), 5 + 105 * (i / 6));

                i++;
            }

            photoPanel.Controls.Add(btnPhotoAdd);//사진 추가 버튼
            btnPhotoAdd.Location = new Point(5 + 105 * (i % 6), 5 + 105 * (i / 6));

        }


        public void viewAllFolder() {
            
                
            folderPanel.Controls.Clear();

            //폴더 리스트의 모든 폴더
            int i = 0;
            foreach(AlbumFolder af in this.FolderList){

                Label lb = new Label();//폴더 이름
                lb.Text = af.folderName;
                lb.Size = new Size(70, 12);
                folderPanel.Controls.Add(lb);
                lb.Location = new Point(5, 60 + 70 * i);

                folderPanel.Controls.Add(af);//폴더
                af.Location = new Point(5, 5+70*i);
                
                

                i++;
                
            }

            folderPanel.Controls.Add(btnFolderAdd);//폴더 추가 버튼
            btnFolderAdd.Location = new Point(5, 10 + 70 * i);
        }

        private void btnPhotoAdd_Click(object sender, EventArgs e)
        {
            AlbumAddPhoto aaf = new AlbumAddPhoto(this);//새 사진를 추가하는 다이얼로그
            aaf.ShowDialog();
        }

        private void initAlbum_db()
        {
            try //예외처리문
            {
                string connectionString = "provider=Microsoft.JET.OLEDB.4.0;" //연결하는 객체의 공급자명(확장자명)
                                        + "data source = "  //데이터 소스=(경로입력하라는거)
                                        + Application.StartupPath ///상대경로 읽어옴
                                        + @"\diaryplannerdb.mdb";//실제 데이터베이스 파일이름

                string commandString = "Select * from [photo_folder]";//memos테이블에 있는 모든필드들을 모두 검색해라.

                OleDbDataAdapter DBAdapter ////DataSet을 채우고 데이터 소스를 업데이트하는 데 사용되는 데이터 명령 집합 및 데이터베이스 연결하게 하는 함수
                    = new OleDbDataAdapter(commandString, connectionString);//connectionString이라는 경로와 쿼리명령을 동적할당

                OleDbCommandBuilder myCommandBuilder ///연결된 데이터베이스에서 DataSet의 변경 내용을 조정하는 데 사용되는 단일 테이블 명령을 자동으로 생성합니다
                    = new OleDbCommandBuilder(DBAdapter);

                DataSet DS = new DataSet(); //DS라는 데이터 셋 동적할당

                DBAdapter.Fill(DS, "photo_folder"); //DS라는 데이터셋에 새로운 memos 테이블에 추가 또는 갱신하겠다고 알림.

                DataTable aTable = DS.Tables["photo_folder"];//home테이블을 불러와 aTable을 새로 생성해서 저장

                for (int i = 0; i < aTable.Rows.Count; i++)
                {
                    if (aTable.Rows[i].ItemArray[2].ToString() == UserProfile.Instance().userId)
                    {
                        add_folder(aTable.Rows[i].ItemArray[0].ToString(), aTable.Rows[i].ItemArray[1].ToString());
                    }
                }
            }
            catch (DataException DE) //DataException에러 발생확인하는 catch문
            {
                MessageBox.Show(DE.Message); //DataExpception 에러 발생시 메세지박스로 에러값을 출력해라.
            }
            catch (Exception DE) //Exception에러 발생확인하는 catch문
            {
                MessageBox.Show(DE.Message);//Expception 에러 발생시 메세지박스로 에러값을 출력해라.
            }
        }

        private void initPhoto_db(String fname)//realname
        {
            try //예외처리문
            {
                string connectionString = "provider=Microsoft.JET.OLEDB.4.0;" //연결하는 객체의 공급자명(확장자명)
                                        + "data source = "  //데이터 소스=(경로입력하라는거)
                                        + Application.StartupPath ///상대경로 읽어옴
                                        + @"\diaryplannerdb.mdb";//실제 데이터베이스 파일이름

                string commandString = "Select * from [photo] where fname ='"+ fname +"'";//memos테이블에 있는 모든필드들을 모두 검색해라.

                OleDbDataAdapter DBAdapter ////DataSet을 채우고 데이터 소스를 업데이트하는 데 사용되는 데이터 명령 집합 및 데이터베이스 연결하게 하는 함수
                    = new OleDbDataAdapter(commandString, connectionString);//connectionString이라는 경로와 쿼리명령을 동적할당

                OleDbCommandBuilder myCommandBuilder ///연결된 데이터베이스에서 DataSet의 변경 내용을 조정하는 데 사용되는 단일 테이블 명령을 자동으로 생성합니다
                    = new OleDbCommandBuilder(DBAdapter);

                DataSet DS = new DataSet(); //DS라는 데이터 셋 동적할당

                DBAdapter.Fill(DS, "photo"); //DS라는 데이터셋에 새로운 memos 테이블에 추가 또는 갱신하겠다고 알림.

                DataTable aTable = DS.Tables["photo"];//home테이블을 불러와 aTable을 새로 생성해서 저장

                for (int i = 0; i < aTable.Rows.Count; i++)
                {
                    if (aTable.Rows[i].ItemArray[3].ToString() == UserProfile.Instance().userId)
                    {
                        add_photo(aTable.Rows[i].ItemArray[0].ToString(), aTable.Rows[i].ItemArray[1].ToString(), aTable.Rows[i].ItemArray[2].ToString());
                    }
                }
            }
            catch (DataException DE) //DataException에러 발생확인하는 catch문
            {
                MessageBox.Show(DE.Message); //DataExpception 에러 발생시 메세지박스로 에러값을 출력해라.
            }
            catch (Exception DE) //Exception에러 발생확인하는 catch문
            {
                MessageBox.Show(DE.Message);//Expception 에러 발생시 메세지박스로 에러값을 출력해라.
            }
        }


        private void add_folder(string realName, string fname) {

            AlbumFolder af = new AlbumFolder(this);
            af.folderName = fname;
            this.FolderList.Add(af);
            this.nowFolder = af;

            initPhoto_db(realName);

        }

        private void add_photo(string pname, string memo, string fname)
        {
            AlbumPhoto ap = new AlbumPhoto(this);
            //사진 저장                                  
            
            ap.photoName = pname;            
            ap.Size = new Size(100, 100);
            
            ap.Image = Image.FromFile("./UserImage/" + UserProfile.Instance().userId + "/Album/" + fname + "/" + pname);
            ap.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;

            ap.photoMemo = memo;
            this.nowFolder.PhotoList.Add(ap);//현재 폴더의 photoList에 사진 추가

        }

        public void closeFolderImage(AlbumFolder af) {
            if (af == null) return;

            af.folderPictureBox.Image = global::DiaryPlanner.Properties.Resources.folder;
            af.folderPictureBox.Location = new System.Drawing.Point(0, 0);
            af.folderPictureBox.Size = new System.Drawing.Size(60, 60);
            af.folderPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;

        }

        public void openFolderImage(AlbumFolder af)
        {
            if (af == null) return;

            af.folderPictureBox.Image = global::DiaryPlanner.Properties.Resources.folderOpen;
            af.folderPictureBox.Location = new System.Drawing.Point(0, 0);
            af.folderPictureBox.Size = new System.Drawing.Size(60, 60);
            af.folderPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;

        }


    }
}
